﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace GoodTrader
{
    public partial class frmMDIMain : Form
    {
#region Frm Collection

        GTChart.frmFutureTickChart mSystemChart = null;
        // 다운로드 관리자
        GTDownload.CpDownLoadManager mDownManager = new GTDownload.CpDownLoadManager();
        // 전역 데이터 세트 - 모든 데이터는 이 안에 있다.
        GTDownload.CpDataSet gDataSet  = new GTDownload.CpDataSet();
        // 옵션 코드 관리자 - 옵션 코드는 여기서 관리한다.
        GTDownload.CpOptionCodeManager mOpManager = null;
        // 옵션 다운로드 목록 - 어떤 가격을 다운로드 받을 지는 시작할 때 결정한다.
        List<GTDownload.CpOptionDownloader> mOpDownloaderList = new List<GTDownload.CpOptionDownloader>();
        // 옵션 가격 관리자 - 옵션 가격을 관리한다. 월저, 월고, 기준가, 목표가 등등.
        GTOption.OpPriceManager mOpPriceMgr = new GTOption.OpPriceManager();

        GTSystem.CP4TrackSystem m_P4TSys = null;
        private CPUTILLib.CpFutureCode m_CpFutureCode = new CPUTILLib.CpFutureCode();

        System.Windows.Forms.Timer m_TradeTimer = new System.Windows.Forms.Timer();

#endregion

        private void InitDownload()
        {
            mOpManager = new GTDownload.CpOptionCodeManager();
            // 오늘 날짜를 내려받는다.
            GTGlobal.mEndDate = GTGlobal.DateToInt();

            if (GTGlobal.EnableOption == true)
            {
                // 등가를 내려 받는다. 
                mOpManager.DownloadATM();
                // 근월물 목록을 만든다.
                mOpManager.MakeRecentMonthPriceList(1);
                // 옵션 데이터 배열을 만든다.
                for (int i = 0; i < mOpManager.RMPriceList.Count; i++)
                {
                    GTDownload.CpOptionData opData = new GTDownload.CpOptionData();
                    string opPriceCode = mOpManager.RMPriceList[i];
                    //gDataSet.OptionDataList.Add(opData);
                    gDataSet.OptionDataMap.Add(opPriceCode, opData);
                }

                // 옵션 다운로더 리스트를 만든다.
                for (int i = 0; i < gDataSet.OptionDataMap.Count; i++)
                {
                    string opPriceCode = mOpManager.RMPriceList[i];
                    GTDownload.CpOptionData opData = gDataSet.OptionDataMap[opPriceCode];
                    GTDownload.CpOptionDownloader opDownloader = new GTDownload.CpOptionDownloader(mDownManager, opData);
                    // 옵션 코드값을 넣어준다.
                    opDownloader.Code = opPriceCode;
                    // 다운로드 관리자에 등록시킨다.
                    mDownManager.Add(opDownloader);
                    // 초기옵션 데이터를 받기 위한 옵션 다운로더에 등록시킨다.
                    mOpDownloaderList.Add(opDownloader);
                }
            }


            GTDownload.CpFutureDayDownloader FutDayObj = new GTDownload.CpFutureDayDownloader(mDownManager, gDataSet.FutureDayData);
            FutDayObj.StartDate = GTGlobal.DateToInt();
            FutDayObj.EndDate = GTGlobal.DateToInt();
            mDownManager.Add(FutDayObj);

            GTDownload.CpFutureDownloader FutObj = new GTDownload.CpFutureDownloader(mDownManager, gDataSet.FutureData);
            FutObj.StartDate = GTGlobal.DateToInt();
            FutObj.EndDate = GTGlobal.DateToInt();
            mDownManager.Add(FutObj);

            GTDownload.CpFutureTickDownloader FutTickObj = new GTDownload.CpFutureTickDownloader(mDownManager, gDataSet.FutureTickData);
            FutTickObj.StartDate = GTGlobal.DateToInt();
            FutTickObj.EndDate = GTGlobal.DateToInt();
            mDownManager.Add(FutTickObj);

            GTDownload.CpFutureMstDownloader FutMstObj = new GTDownload.CpFutureMstDownloader(mDownManager, gDataSet.FutureMstData);
            mDownManager.Add(FutMstObj);

            GTDownload.CpSvrNew7221Downloader SubjectObj = new GTDownload.CpSvrNew7221Downloader(mDownManager, gDataSet.Svr7221Data);
            mDownManager.Add(SubjectObj);

            GTDownload.CpCmeDownloader CmeObj = new GTDownload.CpCmeDownloader(mDownManager, gDataSet.CmeData);
            mDownManager.Add(CmeObj);

            FutDayObj.BlockDownload();
            // 틱차트 메인데이터를 받는다.
            FutTickObj.BlockDownload();
            // 메인 데이터를 받는다.
            FutObj.BlockDownload();
            // 야간선물 데이터를 받는다.
            CmeObj.BlockDownload();

            // 실시간 데이터를 생성해 준다.
            GTDownload.CpSvr8111SDownloader ProgObj = new GTDownload.CpSvr8111SDownloader(mDownManager, gDataSet.Svr8111SData);

            if (GTGlobal.EnableOption == true)
            {
                // 옵션 데이터를 먼저 받는다.
                for (int i = 0; i < mOpDownloaderList.Count; i++)
                {
                    GTDownload.CpOptionDownloader opDownloader = mOpDownloaderList[i];
                    opDownloader.BlockDownload();
                }

                // 옵션 일별 데이터를 받고 저마기목월을 계산한다.
                mOpPriceMgr.OpCodeMgr = mOpManager;
                mOpPriceMgr.Prepare();
                mOpPriceMgr.DownloadOpDayList();
                mOpPriceMgr.FindPrice();
            }

            m_P4TSys.PreRun(1, GTGlobal.MaxDownloadCount - 1);

            // 다운로드 쓰레드를 생성하고 이벤트를 발생시켜 다운로드를 백그라운드로 실행시켜 준다.
            mDownManager.CreateThreadFunc();
            GTDownload.CpDownLoadManager.Event.Set();
        }

        public frmMDIMain()
        {
            InitializeComponent();
            InitSystem();
            InitDownload();
            InitTradeTimer();
        }

        private void InitTradeTimer()
        {
            m_TradeTimer.Interval = 1000;
            m_TradeTimer.Tick += new EventHandler(OnTradeTimer);
            m_TradeTimer.Start();
        }

        void OnTradeTimer(object sender, System.EventArgs e)
        {
            m_P4TSys.Run();
        }
        

        private void InitSystem()
        {
            m_P4TSys = new GTSystem.CP4TrackSystem();
            // 선물 코드 값을 대입해 준다.
            m_P4TSys.Code = m_CpFutureCode.GetData(0, 0).ToString();
            m_P4TSys.CpDataSetObj = gDataSet;
        }

        private void newToolStripMenuItem_Click(object sender, EventArgs e)
        {
            ;
        }

        private void systemChartToolStripMenuItem_Click(object sender, EventArgs e)
        {
            ;
        }

        private void frmMDIMain_Load(object sender, EventArgs e)
        {
            mSystemChart = new GTChart.frmFutureTickChart();
            mSystemChart.CpDataSetObj = gDataSet;
            mSystemChart.Sys = m_P4TSys;
            mSystemChart.MdiParent = this;
            mSystemChart.WindowState = System.Windows.Forms.FormWindowState.Maximized;
            mSystemChart.Show();
        }

        private void frmMDIMain_FormClosing(object sender, FormClosingEventArgs e)
        {
            mDownManager.StopDownload = true;
            mDownManager.DownThreadObject.Join();
            m_TradeTimer.Stop();
        }

        private void codeTableToolStripMenuItem_Click(object sender, EventArgs e)
        {
            GTOption.CpOptionCodeTable opCodeTable = new GTOption.CpOptionCodeTable(mOpManager);
            opCodeTable.Show();
        }

        private void optionChartToolStripMenuItem_Click(object sender, EventArgs e)
        {
            GTChart.frmOptionChart optChart = new GTChart.frmOptionChart();
            optChart.CpDataSetObj = gDataSet; // 데이터셋 설정
            optChart.OpCodeMgr = mOpManager; // 옵션 코드 설정
            optChart.OpPriceMgr = mOpPriceMgr; // 옵션 가격 관리자.
            optChart.MdiParent = this; // 부모 폼 설정
            optChart.Show();
            /*
            GTChart.FrmZoomScrollTrack2 optChart = new GTChart.FrmZoomScrollTrack2();
            optChart.MdiParent = this;
            optChart.Show();
             */ 
        }

        private void trackChartToolStripMenuItem_Click(object sender, EventArgs e)
        {
            ;
        }

        private void subjectChartToolStripMenuItem_Click(object sender, EventArgs e)
        {
            GTChart.frmSubjectChart optChart = new GTChart.frmSubjectChart();
            optChart.CpDataSetObj = gDataSet; // 데이터셋 설정
            optChart.MdiParent = this; // 부모 폼 설정
            optChart.Show();
        }

        private void hogaChartToolStripMenuItem_Click(object sender, EventArgs e)
        {
            GTChart.frmHogaChart optChart = new GTChart.frmHogaChart();
            optChart.CpDataSetObj = gDataSet; // 데이터셋 설정
            optChart.MdiParent = this; // 부모 폼 설정
            optChart.Show();
        }

        private void programChartToolStripMenuItem_Click(object sender, EventArgs e)
        {
            GTChart.frmProgramChart optChart = new GTChart.frmProgramChart();
            optChart.CpDataSetObj = gDataSet; // 데이터셋 설정
            optChart.MdiParent = this; // 부모 폼 설정
            optChart.Show();
        }

        private void 수직정렬ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.LayoutMdi(MdiLayout.TileVertical);
        }

        private void 수평정렬ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.LayoutMdi(MdiLayout.TileHorizontal);
        }

        private void futureTickChartToolStripMenuItem_Click(object sender, EventArgs e)
        {
            GTChart.frmFutureTickChart FutTickChart = new GTChart.frmFutureTickChart();
            FutTickChart.CpDataSetObj = gDataSet;

            FutTickChart.Sys = m_P4TSys;

            FutTickChart.MdiParent = this;
            FutTickChart.Show();
        }

        private void futureDayChartToolStripMenuItem_Click(object sender, EventArgs e)
        {
            GTChart.frmFutureDayChart FutTickChart = new GTChart.frmFutureDayChart();
            FutTickChart.CpDataSetObj = gDataSet;
            FutTickChart.MdiParent = this;
            FutTickChart.Show();
        }

        private void futureChartToolStripMenuItem_Click(object sender, EventArgs e)
        {
            GTChart.frmFutureChart frmChart = new GTChart.frmFutureChart();
            frmChart.CpDataSetObj = gDataSet;
            frmChart.MdiParent = this;
            frmChart.Show();
        }
    }
}
